package com.zjsru.plan2024.codeBase.fifty;

/**
 * 1041. 困于环中的机器人
 * @Author: cookLee
 * @Date: 2024-07-21
 */
public class IsRobotBounded {

    /**
     * 主
     * \
     * 输入：instructions = "GGLLGG"
     * 输出：true
     * 解释：机器人最初在(0,0)处，面向北方。
     * “G”:移动一步。位置:(0,1)方向:北。
     * “G”:移动一步。位置:(0,2).方向:北。
     * “L”:逆时针旋转90度。位置:(0,2).方向:西。
     * “L”:逆时针旋转90度。位置:(0,2)方向:南。
     * “G”:移动一步。位置:(0,1)方向:南。
     * “G”:移动一步。位置:(0,0)方向:南。
     * 重复指令，机器人进入循环:(0,0)——>(0,1)——>(0,2)——>(0,1)——>(0,0)。
     * 在此基础上，我们返回true。
     * \
     * 输入：instructions = "GG"
     * 输出：false
     * 解释：机器人最初在(0,0)处，面向北方。
     * “G”:移动一步。位置:(0,1)方向:北。
     * “G”:移动一步。位置:(0,2).方向:北。
     * 重复这些指示，继续朝北前进，不会进入循环。
     * 在此基础上，返回false。
     * \
     * @param args args
     */
    public static void main(String[] args) {
        IsRobotBounded isRobotBounded = new IsRobotBounded();
        String instructions = "GGLLGG";
        System.out.println(isRobotBounded.isRobotBounded(instructions));
    }

    /**
     * 机器人是有界
     *
     * @param instructions 说明
     * @return boolean
     */
    public boolean isRobotBounded(String instructions) {
        int[][] direc = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        //代表方向，默认北
        int directIndex = 0;
        int x = 0, y = 0;
        int len = instructions.length();
        for (int i = 0; i < len; i++) {
            char instruction = instructions.charAt(i);
            if (instruction == 'G') {
                x += direc[directIndex][0];
                y += direc[directIndex][1];
            } else if (instruction == 'L') {
                //计算方位
                directIndex += 3;
                //取余数，因为方位就四个是固定的
                directIndex %= 4;
            } else {
                directIndex++;
                directIndex %= 4;
            }
        }
        //方向不朝北 或者 是否在原位
        return directIndex != 0 || (x == 0 && y == 0);
    }

}
